<?php

class EmailFieldValidate
{
    /**
     * checks if given value is a valid email address
     *
     * @link http://iamcal.com/publish/articles/php/parsing_email/pdf/
     * @param mixed $value
     * @return boolean
     */
    public function validate($value)
    {
        if ($value === null) {
            return true;
        }
        
        if (isset($this->args)) {
            $parts = explode('@', $value);
            if (isset($parts[1])) {
                if (!$this->customCheckDnsrr($parts[1], 'MX')) {
                    //return false;
                }
            }
        }
        $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
        $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
        $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
        $quotedPair = '\\x5c[\\x00-\\x7f]';
        $domainLiteral = "\\x5b($dtext|$quotedPair)*\\x5d";
        $quotedString = "\\x22($qtext|$quotedPair)*\\x22";
        $domain_ref = $atom;
        $subDomain = "($domain_ref|$domainLiteral)";
        $word = "($atom|$quotedString)";
        $domain = "$subDomain(\\x2e$subDomain)+";
        /*
          following pseudocode to allow strict checking - ask pookey about this if you're puzzled

          if ($this->getValidationOption('strict_checking') == true) {
              $domain = "$sub_domain(\\x2e$sub_domain)*";
          }
        */
        $localPart = "$word(\\x2e$word)*";
        $addrSpec = "$localPart\\x40$domain";
        return (bool) preg_match("!^$addrSpec$!D", $value);
    }
    
	function customCheckDnsrr($host,$recType='') {
	 	if(!empty($host)) {
	  		if($recType=='') $recType="MX";
	  		exec("nslookup -type=$recType $host",$output);
	  		foreach($output as $line) {
	   			if(preg_match("/^$host/", $line)) {
	    		return true;
	   		}
	  	}
	  	return false;
	 	}
	 	return false;
	}

}